#include <stdio.h> 
#include <stdint.h> 
#include <cstdint>

//RS485的CRC校验检测
uint16_t GetCrcData(uint8_t *buffer, uint32_t len)
{
	uint16_t wcrc = 0XFFFF;//16位crc寄存器预置
	uint8_t temp;
	uint32_t i = 0, j = 0;          //计数
	for (i = 0; i < len; i++)       //循环计算每个数据
	{
		temp = *buffer & 0X00FF;    //将八位数据与crc寄存器亦或
		buffer++;                   //指针地址增加，指向下个数据
		wcrc ^= temp;               //将数据存入crc寄存器
		for (j = 0; j < 8; j++)     //循环计算数据的
		{
			if (wcrc & 0X0001)//判断右移出的是不是1，如果是1则与多项式进行异或。
			{
				wcrc >>= 1;//先将数据右移一位
				wcrc ^= 0XA001;//与上面的多项式进行异或
			}
			else//如果不是1，则直接移出
			{
				wcrc >>= 1;//直接移出
			}
		}
	}
	uint16_t CRC_L;//定义数组
	uint8_t CRC_H;
	CRC_L = wcrc & 0xff;//crc的低八位
	CRC_H = wcrc >> 8;//crc的高八位

	printf("out: CRCL=%X, CRCH=%X", CRC_L, CRC_H);

	return ((CRC_L << 8) | CRC_H);
}


int main(void)
{  
	 uint8_t buf[] = { 0x01, 0x03, 0x04, 0x00, 0xF5, 0x01, 0x04 };
	// 01 03 04 00 F5 01 04
	// uint8_t buf[] = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02 };

	printf("Buf= %2X %2X %2X %2X %2X %2X %2X \n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);

	uint16_t ret = 0;

	ret = GetCrcData(buf, sizeof(buf));
	 
	getchar();
	return 0;
}